
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>char和varchar的不同 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>char和varchar的不同 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">CHAR和VARCHAR在存储字符串时的根本区别是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">CHAR是固定长度的字符串类型，无论实际存储的字符串多长，它都会占用指定的固定长度，不足部分用空格填充。而VARCHAR是可变长度的字符串类型，它只存储实际字符数，并额外使用1或2个字节来记录字符串的长度。</div>
          </div>
          <div class="card-source">来源: 数据类型定义</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">当存入的字符串长度小于定义长度时，CHAR类型如何处理，这会带来什么后果？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">对于长度不足的字符串，CHAR类型会自动使用空格字符填充至指定长度。这种机制确保了每条记录长度一致，但也可能导致存储空间浪费，特别是当实际数据长度普遍小于定义长度时。</div>
          </div>
          <div class="card-source">来源: 存储和空间管理 / CHAR：固定长度的存储方式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">VARCHAR类型为了管理可变长度的字符串，需要付出什么额外的存储开销？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">VARCHAR类型需要额外存储字符串的长度信息。具体来说，对于长度在0到255之间的字符串，使用1个字节记录长度；对于长度在256到65,535之间的字符串，使用2个字节记录长度。</div>
          </div>
          <div class="card-source">来源: 存储和空间管理 / VARCHAR：可变长度的存储方式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">在进行高频率的插入和更新操作时，为什么CHAR类型的性能通常优于VARCHAR？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为CHAR类型是固定长度的，数据库在插入和更新时无需计算字符串的实际长度或调整存储位置。这种固定长度的特性使得其插入和更新操作速度较快且稳定。</div>
          </div>
          <div class="card-source">来源: 性能比较 / 1、插入和更新操作</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">请列举两个适合使用CHAR数据类型的实际应用场景。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. 身份证号码：长度固定为18位，使用CHAR(18)可以确保长度一致，提高查询效率。<br>2. 邮政编码：长度通常是固定的，例如美国的ZIP Code是5位，可以使用CHAR(5)存储。</div>
          </div>
          <div class="card-source">来源: 实际应用场景 / CHAR 的实际应用场景</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">请列举两个适合使用VARCHAR数据类型的实际应用场景。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. 用户输入的数据：如用户名、电子邮件地址、评论内容等，这些数据长度通常不固定。<br>2. 文本描述：如产品描述、文章内容等，这些数据长度差异较大，使用VARCHAR可以节省存储空间。</div>
          </div>
          <div class="card-source">来源: 实际应用场景 / VARCHAR 的实际应用场景</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">字符集的选择如何影响一个定义为CHAR(10)的字段所占用的存储空间？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">字符集的选择直接影响存储空间。例如，一个CHAR(10)字段，若使用utf8字符集（每个字符最多占3字节），则需要30字节存储空间；若使用utf8mb4字符集（每个字符最多占4字节），则需要40字节存储空间。</div>
          </div>
          <div class="card-source">来源: 编码和字符集支持 / CHAR 的字符集支持</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">CHAR类型的自动空格填充机制可能引发什么数据完整性或一致性问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">虽然自动填充空格能保持长度一致，但也可能带来问题。例如，用户在查询数据时需要考虑尾部的空格字符，这在某些情况下可能导致数据匹配失败或结果不一致。</div>
          </div>
          <div class="card-source">来源: 数据完整性和一致性 / CHAR 的数据完整性</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在哪些场景下，为了优化性能和存储，会混合使用CHAR和VARCHAR类型？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在用户信息表或配置管理表中。例如，用户信息表里，固定长度的用户账号可以使用CHAR类型以提高查询效率，而可变长度的用户名或电子邮件地址则使用VARCHAR类型以节省存储空间。</div>
          </div>
          <div class="card-source">来源: 实际应用场景 / 混合应用场景</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
